# 导入必要的库
import numpy as np  # 用于数值计算
import pandas as pd  # 用于数据处理和分析
import matplotlib.pyplot as plt  # 用于数据可视化

# 设置中文字体，解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体显示中文
plt.rcParams['axes.unicode_minus'] = False   # 解决负号显示为方框的问题
file_path_clear='../../data/cleared data/'
file_path_image='../../data/image/'
# 读取Excel数据文件
df = pd.read_excel(file_path_clear+'餐饮连锁品牌数据_销售记录3_cleaned.xlsx')

# 数据预处理：将销售时间转换为整数类型
df['销售时间(时)'] = df['销售时间(时)'].astype(int)

# 计算每个时段的客流量（订单数量）
# groupby按小时分组，size()计算每组的记录数
traffic = df.groupby('销售时间(时)').size().reset_index(name='客流量')

# 找出销量最高的菜品ID
# groupby按菜品ID分组，sum()计算总销量，idxmax()返回最大值的索引
top_dish = df.groupby('菜品ID')['销售数量'].sum().idxmax()

# 计算核心菜品在每个时段的销量
# 先筛选出核心菜品的数据，再按小时分组计算销量
core_dish_sales = df[df['菜品ID'] == top_dish].groupby('销售时间(时)')['销售数量'].sum().reset_index(name='核心菜品销量')

# 创建完整的时间范围（6点到17点）
full_hours = pd.DataFrame({'销售时间(时)': range(6, 18)})

# 合并客流量数据，确保所有时段都有数据，缺失值填充为0
merged_data = pd.merge(full_hours, traffic, on='销售时间(时)', how='left').fillna(0)

# 合并核心菜品销量数据，同样处理缺失值
merged_data = pd.merge(merged_data, core_dish_sales, on='销售时间(时)', how='left').fillna(0)

# 创建画布，设置图形大小
plt.figure(figsize=(12, 6))

# 绘制客流量折线图
# 使用分开参数写法：marker设置标记样式，linestyle设置线条样式，color设置颜色
plt.plot(merged_data['销售时间(时)'], merged_data['客流量'],
         marker='o',        # 圆形标记
         linestyle='-',     # 实线
         color='blue',      # 蓝色线条
         linewidth=2,       # 线条宽度
         label='客流量（人）')  # 图例标签

# 绘制核心菜品销量折线图
plt.plot(merged_data['销售时间(时)'], merged_data['核心菜品销量'],
         marker='s',        # 方形标记
         linestyle='-',     # 实线
         color='orange',    # 橙色线条
         linewidth=2,       # 线条宽度
         label='核心菜品销量（份）')  # 图例标签

# 添加数据标签：在每个数据点上方显示具体数值
for i in range(len(merged_data)):
    # 为客流量数据点添加标签
    # iloc按位置索引获取数据，text添加文本标注
    plt.text(merged_data['销售时间(时)'].iloc[i],                    # x坐标（小时）
             merged_data['客流量'].iloc[i] + max(merged_data['客流量']) * 0.02,  # y坐标（数值上方偏移）
             f'{int(merged_data["客流量"].iloc[i])}',               # 显示的文本内容
             ha='center',      # 水平对齐方式：居中
             va='bottom',      # 垂直对齐方式：底部
             fontsize=9,       # 字体大小
             color='blue',     # 文字颜色
             fontweight='bold') # 字体粗细：加粗

    # 为核心菜品销量数据点添加标签
    plt.text(merged_data['销售时间(时)'].iloc[i],
             merged_data['核心菜品销量'].iloc[i] + max(merged_data['核心菜品销量']) * 0.02,
             f'{int(merged_data["核心菜品销量"].iloc[i])}',
             ha='center',
             va='bottom',
             fontsize=9,
             color='orange',
             fontweight='bold')

# 设置图表标题
plt.title('各时段客流量与核心菜品销量趋势', fontsize=16, fontweight='bold')

# 设置x轴标签
plt.xlabel('时段（小时）', fontsize=12)

# 设置y轴标签
plt.ylabel('数量', fontsize=12)

# 显示图例
plt.legend()

# 添加网格线，使用虚线样式，设置透明度
plt.grid(True, linestyle='--', alpha=0.7)

# 设置x轴刻度，显示6到17的所有整数
plt.xticks(range(6, 18))

# 设置x轴显示范围，留出一些边距
plt.xlim(5.5, 17.5)

# 保存图片
plt.savefig(file_path_image+'折线图.png', dpi=150, bbox_inches='tight')# 保存图片
# 自动调整布局，防止元素重叠
plt.tight_layout()

# 显示绘制的图表
plt.show()